import { message } from "antd";
import URL from "url";
const GenerateSchema = require("generate-schema/src/schemas/json");
import { json_parse, unbase64 } from "../../common/utils.js";

const transformJsonToSchema = json => {
	json = json || {};
	let jsonData = json_parse(json);

	jsonData = GenerateSchema(jsonData);

	let schemaData = JSON.stringify(jsonData);

	return schemaData;
};

function postman(importDataModule) {
	function parseUrl(url) {
		return URL.parse(url);
	}

	function checkInterRepeat(interData) {
		let obj = {};
		let arr = [];
		for (let item in interData) {
			// console.log(interData[item].url + "-" + interData[item].method);
			let key =
				interData[item].request.url + "|" + interData[item].request.method;
			if (!obj[key]) {
				arr.push(interData[item]);
				obj[key] = true;
			}
		}
		return arr;
	}

	function handleReq_query(query) {
		let res = [];
		if (query && query.length) {
			for (let item in query) {
				res.push({
					name: query[item].name,
					value: query[item].value
				});
			}
		}
		return res;
	}
	// function handleReq_headers(headers){
	//   let res = [];
	//   if(headers&&headers.length){
	//     for(let item in headers){
	//       res.push({
	//         name: headers[item].key,
	//         desc: headers[item].description,
	//         value: headers[item].value,
	//         required: headers[item].enable
	//       });
	//     }
	//   }
	//   return res;
	// }

	function handleReq_body_form(body_form) {
		let res = [];
		if (body_form && typeof body_form === "object") {
			for (let item in body_form) {
				res.push({
					name: body_form[item].name,
					value: body_form[item].value,
					type: "text"
				});
			}
		}
		return res;
	}

	function handlePath(path) {
		path = parseUrl(path).pathname;
		path = decodeURIComponent(path);
		if (!path) return "";

		path = path.replace(/{{\w*}}/g, "");

		if (path[0] != "/") {
			path = "/" + path;
		}
		return path;
	}

	function run(res) {
		try {
			res = JSON.parse(res);
			res = res.log.entries;

			res = res.filter(item => {
				if (!item) return false;
				return item.response.content.mimeType.indexOf("application/json") === 0;
			});

			let interfaceData = { apis: [] };
			res = checkInterRepeat.bind(this)(res);
			if (res && res.length) {
				for (let item in res) {
					let data = importHar.bind(this)(res[item]);
					interfaceData.apis.push(data);
				}
			}

			return interfaceData;
		} catch (e) {
			console.error(e);
			message.error("数据格式有误");
		}
	}

	function importHar(data, key) {
		let reflect = {
			//数据字段映射关系
			title: "url",
			path: "url",
			method: "method",
			desc: "description",
			req_query: "queryString",
			req_body_form: "params",
			req_body_other: "text"
		};
		let allKey = [
			"title",
			"path",
			"method",
			"req_query",
			"req_body_type",
			"req_body_form",
			"req_body_other",
			"res_body_type",
			"res_body",
			"req_headers"
		];
		key = key || allKey;
		let res = {};

		let reqType = "json",
			header;
		data.request.headers.forEach(item => {
			if (!item || !item.name || !item.value) return null;
			if (
				/content-type/i.test(item.name) &&
				item.value.indexOf("application/json") === 0
			) {
				reqType = "json";
				header = "application/json";
			} else if (
				/content-type/i.test(item.name) &&
				item.value.indexOf("application/x-www-form-urlencoded") === 0
			) {
				header = "application/x-www-form-urlencoded";
				reqType = "form";
			} else if (
				/content-type/i.test(item.name) &&
				item.value.indexOf("multipart/form-data") === 0
			) {
				header = "multipart/form-data";
				reqType = "form";
			}
		});

		for (let item in key) {
			item = key[item];
			if (item === "req_query") {
				res[item] = handleReq_query.bind(this)(data.request[reflect[item]]);
			} else if (
				item === "req_body_form" &&
				reqType === "form" &&
				data.request.postData
			) {
				if (header === "application/x-www-form-urlencoded") {
					res[item] = handleReq_body_form.bind(this)(
						data.request.postData[reflect[item]]
					);
				} else if (header === "multipart/form-data") {
					res[item] = [];
				}
			} else if (
				item === "req_body_other" &&
				reqType === "json" &&
				data.request.postData
			) {
				res.req_body_is_json_schema = true;
				res[item] = transformJsonToSchema(data.request.postData.text);
			} else if (item === "req_headers") {
				res[item] = [
					{
						name: "Content-Type",
						value: header
					}
				];
			} else if (item === "req_body_type") {
				res[item] = reqType;
			} else if (item === "path") {
				res[item] = handlePath.bind(this)(data.request[reflect[item]]);
			} else if (item === "title") {
				let path = handlePath.bind(this)(data.request[reflect["path"]]);
				if (data.request[reflect[item]].indexOf(path) > -1) {
					res[item] = path;
					if (res[item] && res[item].indexOf("/:") > -1) {
						res[item] = res[item].substr(0, res[item].indexOf("/:"));
					}
				} else {
					res[item] = data.request[reflect[item]];
				}
			} else if (item === "res_body_type") {
				res[item] = "json";
			} else if (item === "res_body") {
				res.res_body_is_json_schema = true;
				if (
					data.response.content.encoding &&
					data.response.content.encoding == "base64"
				) {
					//base64
					res[item] = transformJsonToSchema(
						unbase64(data.response.content.text)
					);
				} else {
					res[item] = transformJsonToSchema(data.response.content.text);
				}
			} else {
				res[item] = data.request[reflect[item]];
			}
		}
		return res;
	}

	if (!importDataModule || typeof importDataModule !== "object") {
		console.error("obj参数必需是一个对象");
		return null;
	}

	importDataModule.har = {
		name: "HAR",
		run: run,
		desc: "使用chrome录制请求功能，具体使用请查看文档"
	};
}

module.exports = function () {
	this.bindHook("import_data", postman);
};
